<!DOCTYPE html>
<html dir="ltr" lang="zh">
<head>
<meta charset="utf-8"/>
<meta content="width=device-width, initial-scale=1.0" name="viewport"/>
<meta content="掌握 ArrayList 的扩容相关机制 # 目标 # 掌握 ArrayList 的扩容机制 掌握 Iterator 的 fail-fast、fail-safe 机制 ArrayList 扩容机制 # new ArrayList() 会使用长度为零的数组 new ArrayList(int initialCapacity) 会使用指定容量的数组 public ArrayList(Collection&lt;? extends E&gt; c) 会使用 c 的大小作为数组容量 add(Object o) 首次扩容为 10，再次扩容为上次容量的 1.5 倍 addAll(Collection c) 没有元素时，扩容为 Math.max(10, 实际元素个数)，有元素时为 Math.max(原容量1.5倍, 实际元素个数) ArrayList 前 20 次扩容规律（底层用的是右移计算，如果口算 * 1.5 的话，则取整）：
[0, 10, 15, 22, 33, 49, 73, 109, 163, 244, 366, 549, 823, 1234,1851, 2776, 4164, 6246, 9369, 14053, 21079] 相关问题 # 问：往数组中添加 100 个元素，会扩容成多大？ # 点击展开 ." name="description"/>
<meta content="#FFFFFF" name="theme-color"/>
<meta content="light dark" name="color-scheme"/><meta content="" property="og:title"/>
<meta content="掌握 ArrayList 的扩容相关机制 # 目标 # 掌握 ArrayList 的扩容机制 掌握 Iterator 的 fail-fast、fail-safe 机制 ArrayList 扩容机制 # new ArrayList() 会使用长度为零的数组 new ArrayList(int initialCapacity) 会使用指定容量的数组 public ArrayList(Collection&lt;? extends E&gt; c) 会使用 c 的大小作为数组容量 add(Object o) 首次扩容为 10，再次扩容为上次容量的 1.5 倍 addAll(Collection c) 没有元素时，扩容为 Math.max(10, 实际元素个数)，有元素时为 Math.max(原容量1.5倍, 实际元素个数) ArrayList 前 20 次扩容规律（底层用的是右移计算，如果口算 * 1.5 的话，则取整）：
[0, 10, 15, 22, 33, 49, 73, 109, 163, 244, 366, 549, 823, 1234,1851, 2776, 4164, 6246, 9369, 14053, 21079] 相关问题 # 问：往数组中添加 100 个元素，会扩容成多大？ # 点击展开 ." property="og:description"/>
<meta content="article" property="og:type"/>
<meta content="https://helloputong.gitee.io/notes/java/arraylist-%E6%89%A9%E5%AE%B9%E8%A7%84%E5%88%99/" property="og:url"/><meta content="notes" property="article:section"/>
<title>Array List 扩容规则 | Hello! 噗通 🍀</title>
<link href="/manifest.json" rel="manifest"/>
<link href="/favicon.png" rel="icon" type="image/x-icon"/>
<link crossorigin="anonymous" href="/book.min.a82d7e77ceb134d151c4d7e381eeb30623fbd5a524d58c584d8716ecec0205bd.css" integrity="sha256-qC1+d86xNNFRxNfjge6zBiP71aUk1YxYTYcW7OwCBb0=" rel="stylesheet"/>
<script defer="" src="/flexsearch.min.js"></script>
<script crossorigin="anonymous" defer="" integrity="sha256-+pR/j4Voa/VXQmH38FekcfPx1IEWD5WAkNOJruKNmQk=" src="/zh.search.min.fa947f8f85686bf5574261f7f057a471f3f1d481160f958090d389aee28d9909.js"></script>
<script crossorigin="anonymous" defer="" integrity="sha256-b2+Q/LjrHEnsOJg45rgB0N4ZQwuOUWkC+NdcPIvZhzk=" src="/sw.min.6f6f90fcb8eb1c49ec389838e6b801d0de19430b8e516902f8d75c3c8bd98739.js"></script>
<!--
Made with Book Theme
https://github.com/alex-shpak/hugo-book
-->
</head>
<body dir="ltr">
<input class="hidden toggle" id="menu-control" type="checkbox"/>
<input class="hidden toggle" id="toc-control" type="checkbox"/>
<main class="container flex">
<aside class="book-menu">
<div class="book-menu-content">
<nav>
<h2 class="book-brand">
<a class="flex align-center" href="/"><span>Hello! 噗通 🍀</span>
</a>
</h2>
<div class="book-search">
<input aria-label="Search" data-hotkeys="s/" id="book-search-input" maxlength="64" placeholder="Search" type="text"/>
<div class="book-search-spinner hidden"></div>
<ul id="book-search-results"></ul>
</div>
<ul>
<li class="book-section-flat">
<span>--学习笔记--👇</span>
<ul>
<li>
<input class="toggle" id="section-62161c8b7eae8ea89aee3d6f310b2312" type="checkbox"/>
<label class="flex justify-between" for="section-62161c8b7eae8ea89aee3d6f310b2312">
<a class="" role="button">Android</a>
</label>
<ul>
<li>
<a class="" href="/notes/android/mac%E9%80%9A%E8%BF%87homebrew%E5%AE%89%E8%A3%85java8/">Mac 通过 Homebrew 安装 Java8</a>
</li>
<li>
<a class="" href="/notes/android/%E6%B4%BB%E5%8A%A8%E7%9A%84%E7%94%9F%E5%91%BD%E5%91%A8%E6%9C%9F/">活动的生命周期</a>
</li>
<li>
<a class="" href="/notes/android/%E5%B8%B8%E7%94%A8%E6%8E%A7%E4%BB%B6%E5%92%8C4%E7%A7%8D%E5%B8%83%E5%B1%80/">常用控件和4种布局</a>
</li>
<li>
<a class="" href="/notes/android/android-%E4%B8%AD%E4%BA%8B%E4%BB%B6%E5%AD%A6%E4%B9%A0%E6%80%BB%E7%BB%93/">Android 中事件学习总结</a>
</li>
<li>
<a class="" href="/notes/android/android-%E4%B8%AD%E7%9A%84%E6%B6%88%E6%81%AF%E6%9C%BA%E5%88%B6%E5%92%8C%E5%BC%82%E6%AD%A5%E4%BB%BB%E5%8A%A1/">Android 中的消息机制和异步任务</a>
</li>
<li>
<a class="" href="/notes/android/listview%E4%B8%AD%E5%85%B3%E4%BA%8E%E6%95%B0%E6%8D%AE%E6%9B%B4%E6%96%B0%E7%9A%84%E4%B8%A4%E4%B8%AA%E9%97%AE%E9%A2%98/">List View中关于数据更新的两个问题</a>
</li>
<li>
<a class="" href="/notes/android/spinner-%E5%9F%BA%E6%9C%AC%E4%BD%BF%E7%94%A8/">Spinner 基本使用</a>
</li>
</ul>
</li>
<li>
<input class="toggle" id="section-d1dc8d9746f5c776e8a82499bbb2e7c6" type="checkbox"/>
<label class="flex justify-between" for="section-d1dc8d9746f5c776e8a82499bbb2e7c6">
<a class="" role="button">BMS</a>
</label>
<ul>
<li>
<a class="" href="/notes/bms/bms-%E7%9B%B8%E5%85%B3%E7%90%86%E8%AE%BA%E5%AD%A6%E4%B9%A0/">BMS 相关概念</a>
</li>
<li>
<a class="" href="/notes/bms/%E6%BC%94%E7%A4%BA%E5%8F%82%E6%95%B0%E8%A7%A3%E8%AF%BB/">功能演示</a>
</li>
<li>
<a class="" href="/notes/bms/%E5%8E%9F%E7%90%86%E5%9B%BE%E8%A7%A3%E8%AF%BB/">原理图解读</a>
</li>
<li>
<a class="" href="/notes/bms/%E6%BA%90%E7%A0%81%E8%A7%A3%E6%9E%90/">源码解析</a>
</li>
</ul>
</li>
<li>
<input class="toggle" id="section-b7444509cb631180897a34f028407c2c" type="checkbox"/>
<label class="flex justify-between" for="section-b7444509cb631180897a34f028407c2c">
<a class="" role="button">设计模式</a>
</label>
<ul>
<li>
<a class="" href="/notes/%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F/uml-%E5%9B%BE/">Uml 图</a>
</li>
<li>
<a class="" href="/notes/%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F/%E8%AE%BE%E8%AE%A1%E5%8E%9F%E5%88%99/">设计原则</a>
</li>
<li>
<a class="" href="/notes/%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F/%E5%88%9B%E5%BB%BA%E5%9E%8B%E6%A8%A1%E5%BC%8F/">创建型模式</a>
</li>
<li>
<a class="" href="/notes/%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F/%E7%BB%93%E6%9E%84%E5%9E%8B%E6%A8%A1%E5%BC%8F/">结构型模式</a>
</li>
<li>
<a class="" href="/notes/%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F/%E8%A1%8C%E4%B8%BA%E5%9E%8B%E6%A8%A1%E5%BC%8F/">行为型模式</a>
</li>
</ul>
</li>
<li>
<input class="toggle" id="section-4364152b7ab5995d509c0b7b811005c4" type="checkbox"/>
<label class="flex justify-between" for="section-4364152b7ab5995d509c0b7b811005c4">
<a class="" role="button">JVM</a>
</label>
<ul>
<li>
<a class="" href="/notes/jvm/%E4%BB%80%E4%B9%88%E6%98%AF-jvm/">什么是 Jvm</a>
</li>
<li>
<a class="" href="/notes/jvm/%E7%A8%8B%E5%BA%8F%E8%AE%A1%E6%95%B0%E5%99%A8/">程序计数器</a>
</li>
<li>
<a class="" href="/notes/jvm/%E8%99%9A%E6%8B%9F%E6%9C%BA%E6%A0%88/">虚拟机栈</a>
</li>
<li>
<a class="" href="/notes/jvm/%E6%9C%AC%E5%9C%B0%E6%96%B9%E6%B3%95%E6%A0%88-/">本地方法栈</a>
</li>
<li>
<a class="" href="/notes/jvm/%E5%A0%86/">堆</a>
</li>
<li>
<a class="" href="/notes/jvm/%E6%96%B9%E6%B3%95%E5%8C%BA/">方法区</a>
</li>
<li>
<a class="" href="/notes/jvm/%E7%9B%B4%E6%8E%A5%E5%86%85%E5%AD%98/">直接内存</a>
</li>
<li>
<a class="" href="/notes/jvm/%E5%9E%83%E5%9C%BE%E5%9B%9E%E6%94%B6/">垃圾回收</a>
</li>
<li>
<a class="" href="/notes/jvm/%E5%9E%83%E5%9C%BE%E5%9B%9E%E6%94%B6%E5%99%A8/">垃圾回收器</a>
</li>
</ul>
</li>
<li>
<input class="toggle" id="section-61661238f18c0095524962a5d1d6e676" type="checkbox"/>
<label class="flex justify-between" for="section-61661238f18c0095524962a5d1d6e676">
<a class="" role="button">Spring</a>
</label>
<ul>
<li>
<a class="" href="/notes/spring/beanfactory%E4%B8%8Eapplicationcontext/">Bean Factory与 Application Context</a>
</li>
<li>
<a class="" href="/notes/spring/nacos-%E9%85%8D%E7%BD%AE%E4%B8%AD%E5%BF%83/">Nacos 配置中心</a>
</li>
<li>
<a class="" href="/notes/spring/open-feign-%E8%BF%9C%E7%A8%8B%E8%B0%83%E7%94%A8%E7%A4%BA%E4%BE%8B/">Open Feign 远程调用示例</a>
</li>
<li>
<a class="" href="/notes/spring/springboot-%E6%95%B4%E5%90%88-mybatis-plus/">Spring Boot 整合 My Batis Plus</a>
</li>
</ul>
</li>
<li>
<input class="toggle" id="section-39abd0d44427d4a54e694a2b3f22d967" type="checkbox"/>
<label class="flex justify-between" for="section-39abd0d44427d4a54e694a2b3f22d967">
<a class="" role="button">TensorFlow</a>
</label>
<ul>
<li>
<a class="" href="/notes/tensorflow/tensorflow-%E7%AC%94%E8%AE%B0%E4%B8%80/">Tensor Flow 笔记（一）</a>
</li>
<li>
<a class="" href="/notes/tensorflow/tensorflow-%E7%AC%94%E8%AE%B0%E4%BA%8C/">Tensor Flow 笔记（二）</a>
</li>
<li>
<a class="" href="/notes/tensorflow/tensorflow-%E7%AC%94%E8%AE%B0%E4%B8%89/">Tensor Flow 笔记（三）</a>
</li>
<li>
<a class="" href="/notes/tensorflow/tensorflow-%E7%AC%94%E8%AE%B0%E5%9B%9B/">Tensor Flow 笔记（四）</a>
</li>
<li>
<a class="" href="/notes/tensorflow/tensorflow-%E7%AC%94%E8%AE%B0%E4%BA%94/">Tensor Flow 笔记（五）</a>
</li>
</ul>
</li>
<li>
<input class="toggle" id="section-e2ca0d138d67d9d3ae55da25ac044829" type="checkbox"/>
<label class="flex justify-between" for="section-e2ca0d138d67d9d3ae55da25ac044829">
<a class="" role="button">Redis</a>
</label>
<ul>
<li>
<a class="" href="/notes/redis/nosql%E6%95%B0%E6%8D%AE%E5%BA%93%E7%AE%80%E4%BB%8B/">No Sql数据库简介</a>
</li>
<li>
<a class="" href="/notes/redis/redis-key/">Redis Key</a>
</li>
<li>
<a class="" href="/notes/redis/redis-string/">Redis String</a>
</li>
<li>
<a class="" href="/notes/redis/redis-list/">Redis List</a>
</li>
<li>
<a class="" href="/notes/redis/redis-set/">Redis Set</a>
</li>
<li>
<a class="" href="/notes/redis/redis-hash/">Redis Hash</a>
</li>
<li>
<a class="" href="/notes/redis/redis-zset/">Redis Zset</a>
</li>
<li>
<a class="" href="/notes/redis/redis-%E5%8F%91%E5%B8%83%E4%B8%8E%E8%AE%A2%E9%98%85/">Redis 发布与订阅</a>
</li>
<li>
<a class="" href="/notes/redis/redis-jedis/">Redis Jedis</a>
</li>
<li>
<a class="" href="/notes/redis/springboot-%E6%95%B4%E5%90%88-redis/">Spring Boot 整合 Redis</a>
</li>
<li>
<a class="" href="/notes/redis/redis-%E4%BA%8B%E5%8A%A1%E5%92%8C%E9%94%81%E6%9C%BA%E5%88%B6/">Redis 事务和锁机制</a>
</li>
</ul>
</li>
<li>
<input class="toggle" id="section-58f730a0b22fcdc7a886db614d77f88c" type="checkbox"/>
<label class="flex justify-between" for="section-58f730a0b22fcdc7a886db614d77f88c">
<a class="" role="button">代码随想录刷题</a>
</label>
<ul>
<li>
<a class="" href="/notes/leetcode/day001-%E7%AC%AC%E4%B8%80%E7%AB%A0%E6%95%B0%E7%BB%84/">Day001 第一章数组</a>
</li>
<li>
<a class="" href="/notes/leetcode/day002-%E7%AC%AC%E4%B8%80%E7%AB%A0%E6%95%B0%E7%BB%84/">Day002 第一章数组</a>
</li>
<li>
<a class="" href="/notes/leetcode/day003-%E7%AC%AC%E4%BA%8C%E7%AB%A0%E9%93%BE%E8%A1%A8/">Day003 第二章链表</a>
</li>
<li>
<a class="" href="/notes/leetcode/day004-%E7%AC%AC%E4%BA%8C%E7%AB%A0%E9%93%BE%E8%A1%A8/">Day004 第二章链表</a>
</li>
<li>
<a class="" href="/notes/leetcode/day006-%E7%AC%AC%E4%B8%89%E7%AB%A0%E5%93%88%E5%B8%8C%E8%A1%A8/">Day006 第三章哈希表</a>
</li>
<li>
<a class="" href="/notes/leetcode/day007-%E7%AC%AC%E4%B8%89%E7%AB%A0%E5%93%88%E5%B8%8C%E8%A1%A8/">Day007 第三章哈希表</a>
</li>
<li>
<a class="" href="/notes/leetcode/day008-%E7%AC%AC%E5%9B%9B%E7%AB%A0%E5%AD%97%E7%AC%A6%E4%B8%B2/">Day008 第四章字符串</a>
</li>
<li>
<a class="" href="/notes/leetcode/day009-%E7%AC%AC%E5%9B%9B%E7%AB%A0%E5%AD%97%E7%AC%A6%E4%B8%B2/">Day009 第四章字符串</a>
</li>
<li>
<a class="" href="/notes/leetcode/day010-%E7%AC%AC%E4%BA%94%E7%AB%A0%E6%A0%88%E4%B8%8E%E9%98%9F%E5%88%97/">Day010 第五章栈与队列</a>
</li>
<li>
<a class="" href="/notes/leetcode/day011-%E7%AC%AC%E4%BA%94%E7%AB%A0%E6%A0%88%E4%B8%8E%E9%98%9F%E5%88%97/">Day011 第五章栈与队列</a>
</li>
<li>
<a class="" href="/notes/leetcode/day013-%E7%AC%AC%E4%BA%94%E7%AB%A0%E6%A0%88%E4%B8%8E%E9%98%9F%E5%88%97/">Day013 第五章栈与队列</a>
</li>
<li>
<a class="" href="/notes/leetcode/day014-%E7%AC%AC%E5%85%AD%E7%AB%A0%E4%BA%8C%E5%8F%89%E6%A0%91/">Day014 第六章二叉树</a>
</li>
<li>
<a class="" href="/notes/leetcode/day015-%E7%AC%AC%E5%85%AD%E7%AB%A0%E4%BA%8C%E5%8F%89%E6%A0%91/">Day015 第六章二叉树</a>
</li>
<li>
<a class="" href="/notes/leetcode/day017-%E7%AC%AC%E5%85%AD%E7%AB%A0%E4%BA%8C%E5%8F%89%E6%A0%91/">Day017 第六章二叉树</a>
</li>
</ul>
</li>
<li>
<input class="toggle" id="section-4f95435d3a74007e2c985ea455bbb6e6" type="checkbox"/>
<label class="flex justify-between" for="section-4f95435d3a74007e2c985ea455bbb6e6">
<a class="" role="button">MyBatisPlus</a>
</label>
<ul>
<li>
<a class="" href="/notes/mybatisplus/%E5%BF%AB%E9%80%9F%E5%85%A5%E9%97%A8/">MP快速入门</a>
</li>
<li>
<a class="" href="/notes/mybatisplus/%E4%B8%80%E8%88%AC%E6%9F%A5%E8%AF%A2%E6%93%8D%E4%BD%9C/">一般查询操作</a>
</li>
<li>
<a class="" href="/notes/mybatisplus/%E5%88%86%E9%A1%B5%E6%9F%A5%E8%AF%A2/">分页查询</a>
</li>
<li>
<a class="" href="/notes/mybatisplus/%E9%80%BB%E8%BE%91%E5%88%A0%E9%99%A4/">逻辑删除</a>
</li>
<li>
<a class="" href="/notes/mybatisplus/%E6%9D%A1%E4%BB%B6%E6%9F%A5%E8%AF%A2/">条件查询</a>
</li>
<li>
<a class="" href="/notes/mybatisplus/%E5%B0%81%E8%A3%85service%E4%BD%BF%E7%94%A8/">封装service使用</a>
</li>
</ul>
</li>
<li>
<input class="toggle" id="section-3907b2cf55ed520ad784e24525c8baa4" type="checkbox"/>
<label class="flex justify-between" for="section-3907b2cf55ed520ad784e24525c8baa4">
<a class="" role="button">Swift</a>
</label>
<ul>
<li>
<a class="" href="/notes/swift/swiftui-%E5%B8%B8%E7%94%A8%E8%A7%86%E5%9B%BE-views/">Swift Ui 常用视图 Views</a>
</li>
<li>
<a class="" href="/notes/swift/swiftui-%E4%BF%A1%E6%81%AF%E8%A7%86%E5%9B%BE-views/">Swift Ui 信息视图 Views</a>
</li>
<li>
<a class="" href="/notes/swift/swiftui-%E5%B1%82%E7%BA%A7%E8%A7%86%E5%9B%BE-views/">Swift Ui 层级视图 Views</a>
</li>
<li>
<a class="" href="/notes/swift/swiftui-%E6%8E%A7%E5%88%B6%E8%A7%86%E5%9B%BE-views/">Swift Ui 控制视图 Views</a>
</li>
</ul>
</li>
<li>
<input checked="" class="toggle" id="section-0f70934a6e5284fbc93928c61dfe9c83" type="checkbox"/>
<label class="flex justify-between" for="section-0f70934a6e5284fbc93928c61dfe9c83">
<a class="" role="button">Java</a>
</label>
<ul>
<li>
<a class="active" href="/notes/java/arraylist-%E6%89%A9%E5%AE%B9%E8%A7%84%E5%88%99/">Array List 扩容规则</a>
</li>
<li>
<a class="" href="/notes/java/hashmap-%E7%9B%B8%E5%85%B3%E5%AD%A6%E4%B9%A0%E6%80%BB%E7%BB%93/">Hash Map 相关学习总结</a>
</li>
<li>
<a class="" href="/notes/java/java-%E5%8F%8D%E5%B0%84/">Java 反射</a>
</li>
</ul>
</li>
<li>
<input class="toggle" id="section-3d1ea9814960db7e996773b67773e705" type="checkbox"/>
<label class="flex justify-between" for="section-3d1ea9814960db7e996773b67773e705">
<a class="" role="button">Java八股</a>
</label>
<ul>
<li>
<a class="" href="/notes/java-%E7%9B%B8%E5%85%B3/%E5%B9%B6%E5%8F%91/">Concurrence</a>
</li>
<li>
<a class="" href="/notes/java-%E7%9B%B8%E5%85%B3/mybatis/">MyBatis</a>
</li>
<li>
<a class="" href="/notes/java-%E7%9B%B8%E5%85%B3/mysql/">MySQL</a>
</li>
<li>
<a class="" href="/notes/java-%E7%9B%B8%E5%85%B3/jvm/">Jvm</a>
</li>
<li>
<a class="" href="/notes/java-%E7%9B%B8%E5%85%B3/redis/">Redis</a>
</li>
</ul>
</li>
<li>
<input class="toggle" id="section-ea55243c547fa272027885b73a74852e" type="checkbox"/>
<label class="flex justify-between" for="section-ea55243c547fa272027885b73a74852e">
<a class="" role="button">嵌入式重点总结</a>
</label>
<ul>
<li>
<a class="" href="/notes/%E5%B5%8C%E5%85%A5%E5%BC%8F%E6%80%BB%E7%BB%93/c/">C 语言相关</a>
</li>
<li>
<a class="" href="/notes/%E5%B5%8C%E5%85%A5%E5%BC%8F%E6%80%BB%E7%BB%93/%E4%B8%AD%E6%96%AD%E7%B3%BB%E7%BB%9F/">中断系统</a>
</li>
<li>
<a class="" href="/notes/%E5%B5%8C%E5%85%A5%E5%BC%8F%E6%80%BB%E7%BB%93/%E5%AE%9A%E6%97%B6%E5%99%A8/">TIM</a>
</li>
<li>
<a class="" href="/notes/%E5%B5%8C%E5%85%A5%E5%BC%8F%E6%80%BB%E7%BB%93/adc/">ADC</a>
</li>
<li>
<a class="" href="/notes/%E5%B5%8C%E5%85%A5%E5%BC%8F%E6%80%BB%E7%BB%93/%E5%B8%B8%E8%A7%81%E9%97%AE%E9%A2%98/">嵌入式知识点串烧</a>
</li>
</ul>
</li>
</ul>
</li>
<li class="book-section-flat">
<span>--解决方案--👇</span>
<ul>
<li>
<input class="toggle" id="section-f1d4602254471b9d0da445dd468cd456" type="checkbox"/>
<label class="flex justify-between" for="section-f1d4602254471b9d0da445dd468cd456">
<a class="" role="button">环境配置</a>
</label>
<ul>
<li>
<a class="" href="/solution/environment/apple-m%E7%B3%BB%E5%88%97%E8%8A%AF%E7%89%87%E5%AE%89%E8%A3%85-pyqt/">Apple M系列芯片安装 Pyqt</a>
</li>
<li>
<a class="" href="/solution/environment/docker-%E5%AE%89%E8%A3%85-redis-/">Docker 安装 Redis</a>
</li>
<li>
<a class="" href="/solution/environment/hugo-%E4%B8%BB%E9%A2%98-hugo-book-%E4%B8%AD%E8%8B%B1%E6%96%87%E6%90%9C%E7%B4%A2%E9%85%8D%E7%BD%AE/">Hugo 主题 Hugo Book 中英文搜索配置</a>
</li>
<li>
<a class="" href="/solution/environment/iterm2-oh-my-zsh-%E9%85%8D%E7%BD%AE/">I Term2 Oh My Zsh 配置</a>
</li>
<li>
<a class="" href="/solution/environment/m1-%E8%8A%AF%E7%89%87-docker-%E5%AE%89%E8%A3%85-mysql5.7-/">M1 芯片 Docker 安装 Mysql5.7</a>
</li>
<li>
<a class="" href="/solution/environment/mac-idea-%E5%BF%AB%E6%8D%B7%E9%94%AE%E4%BD%8D/">MAC Idea 快捷键位</a>
</li>
<li>
<a class="" href="/solution/environment/mac-%E5%90%AF%E5%8A%A8%E5%8F%B0%E8%87%AA%E5%AE%9A%E4%B9%89%E8%A1%8C%E5%88%97%E5%B8%83%E5%B1%80/">MAC 启动台自定义行列布局</a>
</li>
<li>
<a class="" href="/solution/environment/%E5%86%85%E7%BD%91%E7%A9%BF%E9%80%8F/">内网穿透</a>
</li>
<li>
<a class="" href="/solution/environment/%E5%86%85%E7%BD%91%E7%A9%BF%E9%80%8F%E7%9A%84%E8%87%AA%E5%90%AF%E5%8A%A8%E8%AE%BE%E7%BD%AE/">内网穿透的自启动设置</a>
</li>
</ul>
</li>
<li>
<input class="toggle" id="section-5a76a664ba4855b79d3c1bc77e5b08b1" type="checkbox"/>
<label class="flex justify-between" for="section-5a76a664ba4855b79d3c1bc77e5b08b1">
<a class="" role="button">杂乱问题</a>
</label>
<ul>
<li>
<a class="" href="/solution/problems/brew-%E4%B8%80%E4%BA%9B%E5%B8%B8%E7%94%A8%E5%91%BD%E4%BB%A4/">Brew 一些常用命令</a>
</li>
<li>
<a class="" href="/solution/problems/docker-%E5%B8%B8%E7%94%A8%E5%91%BD%E4%BB%A4/">Docker 常用命令</a>
</li>
<li>
<a class="" href="/solution/problems/git-github-%E7%9B%B8%E5%85%B3%E5%91%BD%E4%BB%A4%E6%95%B4%E7%90%86/">Git Git Hub 相关命令整理</a>
</li>
<li>
<a class="" href="/solution/problems/%E9%9D%A2%E8%AF%95%E9%A2%98%E6%89%AB%E7%9B%B2/">面试题扫盲</a>
</li>
</ul>
</li>
</ul>
</li>
<li class="book-section-flat">
<span>一点业余👇</span>
<ul>
</ul>
</li>
<li class="book-section-flat">
<span>--其他记录--👇</span>
<ul>
<li>
<input class="toggle" id="section-9ef4d2063ddc9af7785b193647f22260" type="checkbox"/>
<label class="flex justify-between" for="section-9ef4d2063ddc9af7785b193647f22260">
<a class="" role="button">我和阿刁</a>
</label>
<ul>
<li>
<a class="" href="/daily/ad/%E5%85%B3%E4%BA%8E%E9%98%BF%E5%88%812022%E5%B9%B4%E7%9A%84%E7%94%9F%E6%97%A5%E7%9A%84%E5%B0%8F%E8%AE%BA%E6%96%87/">关于阿刁2022年的生日的小论文</a>
</li>
<li>
<a class="" href="/daily/ad/%E5%85%B3%E4%BA%8E%E9%98%BF%E5%88%81%E7%9A%842021%E5%B9%B4%E5%BA%A6%E6%80%BB%E7%BB%93/">关于阿刁的2021年度总结</a>
</li>
<li>
<a class="" href="/daily/ad/%E5%85%B3%E4%BA%8E%E9%98%BF%E5%88%81%E7%9A%842022%E5%B9%B4%E5%BA%A6%E6%80%BB%E7%BB%93/">关于阿刁的2022年度总结</a>
</li>
</ul>
</li>
</ul>
</li>
</ul>
</nav>
<script>(function(){var e=document.querySelector("aside .book-menu-content");addEventListener("beforeunload",function(){localStorage.setItem("menu.scrollTop",e.scrollTop)}),e.scrollTop=localStorage.getItem("menu.scrollTop")})()</script>
</div>
</aside>
<div class="book-page">
<header class="book-header">
<div class="flex align-center justify-between">
<label for="menu-control">
<img alt="Menu" class="book-icon" src="/svg/menu.svg"/>
</label>
<strong>Array List 扩容规则</strong>
<label for="toc-control">
<img alt="Table of Contents" class="book-icon" src="/svg/toc.svg"/>
</label>
</div>
<aside class="hidden clearfix">
<nav id="TableOfContents">
<ul>
<li><a href="#掌握-arraylist-的扩容相关机制">掌握 ArrayList 的扩容相关机制</a>
<ul>
<li><a href="#目标">目标</a></li>
<li><a href="#arraylist-扩容机制">ArrayList 扩容机制</a>
<ul>
<li><a href="#相关问题">相关问题</a>
<ul>
<li><a href="#问往数组中添加-100-个元素会扩容成多大">问：往数组中添加 100 个元素，会扩容成多大？</a></li>
<li><a href="#什么情况下你会使用arraylist什么时候你会选择linkedlist">什么情况下你会使用ArrayList？什么时候你会选择LinkedList？</a></li>
<li><a href="#问arraylist是如何扩容的">问：ArrayList是如何扩容的？</a></li>
<li><a href="#arraylist的遍历有哪些方法">ArrayList的遍历有哪些方法？</a></li>
<li><a href="#如何复制某个arraylist到另一个arraylist中去">如何复制某个ArrayList到另一个ArrayList中去？</a></li>
<li><a href="#在索引中arraylist的增加或者删除某个对象的运行过程效率很低吗解释一下为什么">在索引中ArrayList的增加或者删除某个对象的运行过程？效率很低吗？解释一下为什么？</a></li>
</ul>
</li>
</ul>
</li>
<li><a href="#fail-fast-和-fail-safe">fail-fast 和 fail-safe</a>
<ul>
<li><a href="#fail-fast">fail-fast</a></li>
<li><a href="#fail-safe">fail-safe</a></li>
</ul>
</li>
</ul>
</li>
</ul>
</nav>
</aside>
</header>
<article class="markdown"><h1 id="掌握-arraylist-的扩容相关机制">
  掌握 ArrayList 的扩容相关机制
  <a class="anchor" href="#%e6%8e%8c%e6%8f%a1-arraylist-%e7%9a%84%e6%89%a9%e5%ae%b9%e7%9b%b8%e5%85%b3%e6%9c%ba%e5%88%b6">#</a>
</h1>
<h2 id="目标">
  目标
  <a class="anchor" href="#%e7%9b%ae%e6%a0%87">#</a>
</h2>
<ul>
<li>掌握 ArrayList 的扩容机制</li>
<li>掌握 Iterator 的 fail-fast、fail-safe 机制</li>
</ul>
<h2 id="arraylist-扩容机制">
  ArrayList 扩容机制
  <a class="anchor" href="#arraylist-%e6%89%a9%e5%ae%b9%e6%9c%ba%e5%88%b6">#</a>
</h2>
<ul>
<li><code>new ArrayList()</code> 会使用长度为零的数组</li>
<li><code>new ArrayList(int initialCapacity)</code> 会使用指定容量的数组</li>
<li><code>public ArrayList(Collection&lt;? extends E&gt; c)</code> 会使用 c 的大小作为数组容量</li>
<li><code>add(Object o)</code> 首次扩容为 10，再次扩容为上次容量的 1.5 倍</li>
<li><code>addAll(Collection c)</code> 没有元素时，<code>扩容为 Math.max(10, 实际元素个数)</code>，有元素时为 <code>Math.max(原容量1.5倍, 实际元素个数)</code></li>
</ul>
<p>ArrayList 前 20 次扩容规律（底层用的是右移计算，如果口算 * 1.5 的话，则取整）：</p>
<div class="highlight"><pre style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;" tabindex="0"><code class="language-java" data-lang="java"><span style="display:flex;"><span><span style="color:#f92672">[</span><span style="color:#ae81ff">0</span><span style="color:#f92672">,</span> <span style="color:#ae81ff">10</span><span style="color:#f92672">,</span> <span style="color:#ae81ff">15</span><span style="color:#f92672">,</span> <span style="color:#ae81ff">22</span><span style="color:#f92672">,</span> <span style="color:#ae81ff">33</span><span style="color:#f92672">,</span> <span style="color:#ae81ff">49</span><span style="color:#f92672">,</span> <span style="color:#ae81ff">73</span><span style="color:#f92672">,</span> <span style="color:#ae81ff">109</span><span style="color:#f92672">,</span> <span style="color:#ae81ff">163</span><span style="color:#f92672">,</span> <span style="color:#ae81ff">244</span><span style="color:#f92672">,</span> <span style="color:#ae81ff">366</span><span style="color:#f92672">,</span> <span style="color:#ae81ff">549</span><span style="color:#f92672">,</span> <span style="color:#ae81ff">823</span><span style="color:#f92672">,</span> <span style="color:#ae81ff">1234</span><span style="color:#f92672">,</span><span style="color:#ae81ff">1851</span><span style="color:#f92672">,</span> <span style="color:#ae81ff">2776</span><span style="color:#f92672">,</span> <span style="color:#ae81ff">4164</span><span style="color:#f92672">,</span> <span style="color:#ae81ff">6246</span><span style="color:#f92672">,</span> <span style="color:#ae81ff">9369</span><span style="color:#f92672">,</span> <span style="color:#ae81ff">14053</span><span style="color:#f92672">,</span> <span style="color:#ae81ff">21079</span><span style="color:#f92672">]</span>
</span></span></code></pre></div><h3 id="相关问题">
  相关问题
  <a class="anchor" href="#%e7%9b%b8%e5%85%b3%e9%97%ae%e9%a2%98">#</a>
</h3>
<h4 id="问往数组中添加-100-个元素会扩容成多大">
  问：往数组中添加 100 个元素，会扩容成多大？
  <a class="anchor" href="#%e9%97%ae%e5%be%80%e6%95%b0%e7%bb%84%e4%b8%ad%e6%b7%bb%e5%8a%a0-100-%e4%b8%aa%e5%85%83%e7%b4%a0%e4%bc%9a%e6%89%a9%e5%ae%b9%e6%88%90%e5%a4%9a%e5%a4%a7">#</a>
</h4>
<div class="book-expand">
<label>
<div class="book-expand-head flex justify-between">
<span>点击展开</span>
<span>...</span>
</div>
<input class="hidden" type="checkbox"/>
<div class="book-expand-content markdown-inner">
<div class="highlight"><pre style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;" tabindex="0"><code class="language-java" data-lang="java"><span style="display:flex;"><span><span style="color:#f92672">[</span><span style="color:#ae81ff">0</span><span style="color:#f92672">,</span> <span style="color:#ae81ff">10</span><span style="color:#f92672">,</span> <span style="color:#ae81ff">15</span><span style="color:#f92672">,</span> <span style="color:#ae81ff">22</span><span style="color:#f92672">,</span> <span style="color:#ae81ff">33</span><span style="color:#f92672">,</span> <span style="color:#ae81ff">49</span><span style="color:#f92672">,</span> <span style="color:#ae81ff">73</span><span style="color:#f92672">,</span> <span style="color:#ae81ff">109</span><span style="color:#f92672">,</span> <span style="color:#ae81ff">163</span><span style="color:#f92672">,</span> <span style="color:#ae81ff">244</span><span style="color:#f92672">,</span> <span style="color:#ae81ff">366</span><span style="color:#f92672">,</span> <span style="color:#ae81ff">549</span><span style="color:#f92672">,</span> <span style="color:#ae81ff">823</span><span style="color:#f92672">,</span> <span style="color:#ae81ff">1234</span><span style="color:#f92672">,</span><span style="color:#ae81ff">1851</span><span style="color:#f92672">,</span> <span style="color:#ae81ff">2776</span><span style="color:#f92672">,</span> <span style="color:#ae81ff">4164</span><span style="color:#f92672">,</span> <span style="color:#ae81ff">6246</span><span style="color:#f92672">,</span> <span style="color:#ae81ff">9369</span><span style="color:#f92672">,</span> <span style="color:#ae81ff">14053</span><span style="color:#f92672">,</span> <span style="color:#ae81ff">21079</span><span style="color:#f92672">]</span>
</span></span></code></pre></div><p>由上表可以看出，添加 100 个元素后，容量为 109</p>
</div>
</label>
</div>
<h4 id="什么情况下你会使用arraylist什么时候你会选择linkedlist">
  什么情况下你会使用ArrayList？什么时候你会选择LinkedList？
  <a class="anchor" href="#%e4%bb%80%e4%b9%88%e6%83%85%e5%86%b5%e4%b8%8b%e4%bd%a0%e4%bc%9a%e4%bd%bf%e7%94%a8arraylist%e4%bb%80%e4%b9%88%e6%97%b6%e5%80%99%e4%bd%a0%e4%bc%9a%e9%80%89%e6%8b%a9linkedlist">#</a>
</h4>
<div class="book-expand">
<label>
<div class="book-expand-head flex justify-between">
<span>点击展开</span>
<span>...</span>
</div>
<input class="hidden" type="checkbox"/>
<div class="book-expand-content markdown-inner">
<blockquote class="book-hint danger">
  ArrayList 增删慢、查询快；LinkedList 增删快，查询慢。
</blockquote>
<p>上面回答是典型的错误，二者的查询是一样的时间复杂度，注意 <code>查询 != 随机访问</code>。</p>
<p><strong>ArrayList 和 LinkedList 比较：</strong></p>
<ul>
<li>
<p><strong>ArrayList</strong></p>
<ul>
<li>基于数组，需要连续内存</li>
<li>随机访问快（指根据下标访问）</li>
<li>尾部插入、删除性能可以，其它部分插入、删除都会移动数据，因此性能会低</li>
<li>可以利用 cpu 缓存，局部性原理</li>
</ul>
</li>
<li>
<p><strong>LinkedList</strong></p>
<ul>
<li>基于双向链表，无需连续内存</li>
<li>随机访问慢（要沿着链表遍历）</li>
<li>头尾插入删除性能高</li>
<li>占用内存多</li>
</ul>
</li>
</ul>
<p><strong>两者补充：</strong> 两者在中间插入速度都比较慢，但是 ArrayList 中间插入速度要比 Linked 中间插入速度快。ArrayList 快在定位，慢在增删数据；LinkedList 慢在定位，快在增删数据。</p>
<p><strong>总结：</strong></p>
<p>随机访问元素比插入、删除元素更加频繁的时候，应该使用ArrayList。</p>
<p>尾部插入、删除元素频繁的时候，应该使用ArrayList。</p>
<p>中间插入、删除元素频繁的时候，应该使用ArrayList。</p>
<p>头部插入、删除元素频繁的时候，应该使用LinkedList。</p>
</div>
</label>
</div>
<h4 id="问arraylist是如何扩容的">
  问：ArrayList是如何扩容的？
  <a class="anchor" href="#%e9%97%aearraylist%e6%98%af%e5%a6%82%e4%bd%95%e6%89%a9%e5%ae%b9%e7%9a%84">#</a>
</h4>
<div class="book-expand">
<label>
<div class="book-expand-head flex justify-between">
<span>点击展开</span>
<span>...</span>
</div>
<input class="hidden" type="checkbox"/>
<div class="book-expand-content markdown-inner">
<p>ArrayList扩容后的大小等于扩容前大小的1.5倍。</p>
<p>可能会导致的问题：</p>
<ul>
<li>内存不足抛出OutOfMemoryError。</li>
<li>扩容的时候还需要对数组进行拷贝，这个也挺费时的。</li>
</ul>
<p><strong>解决方案：面对大量数据时</strong>，使用的时候要竭力避免扩容，提供一个初始估计容量参数，以免扩容对性能带来较大影响。</p>
</div>
</label>
</div>
<h4 id="arraylist的遍历有哪些方法">
  ArrayList的遍历有哪些方法？
  <a class="anchor" href="#arraylist%e7%9a%84%e9%81%8d%e5%8e%86%e6%9c%89%e5%93%aa%e4%ba%9b%e6%96%b9%e6%b3%95">#</a>
</h4>
<div class="book-expand">
<label>
<div class="book-expand-head flex justify-between">
<span>点击展开</span>
<span>...</span>
</div>
<input class="hidden" type="checkbox"/>
<div class="book-expand-content markdown-inner">
<ol>
<li>普通for循环的方式。</li>
<li>增强for循环的方式。</li>
<li>迭代器的方式。</li>
</ol>
</div>
</label>
</div>
<h4 id="如何复制某个arraylist到另一个arraylist中去">
  如何复制某个ArrayList到另一个ArrayList中去？
  <a class="anchor" href="#%e5%a6%82%e4%bd%95%e5%a4%8d%e5%88%b6%e6%9f%90%e4%b8%aaarraylist%e5%88%b0%e5%8f%a6%e4%b8%80%e4%b8%aaarraylist%e4%b8%ad%e5%8e%bb">#</a>
</h4>
<div class="book-expand">
<label>
<div class="book-expand-head flex justify-between">
<span>点击展开</span>
<span>...</span>
</div>
<input class="hidden" type="checkbox"/>
<div class="book-expand-content markdown-inner">
      三种办法：
使用clone()方法，比如ArrayList newArray = oldArray.clone();
使用ArrayList构造方法，比如：ArrayList myObject = new ArrayList(myTempObject);
使用Collection的copy方法。
    </div>
</label>
</div>
<h4 id="在索引中arraylist的增加或者删除某个对象的运行过程效率很低吗解释一下为什么">
  在索引中ArrayList的增加或者删除某个对象的运行过程？效率很低吗？解释一下为什么？
  <a class="anchor" href="#%e5%9c%a8%e7%b4%a2%e5%bc%95%e4%b8%adarraylist%e7%9a%84%e5%a2%9e%e5%8a%a0%e6%88%96%e8%80%85%e5%88%a0%e9%99%a4%e6%9f%90%e4%b8%aa%e5%af%b9%e8%b1%a1%e7%9a%84%e8%bf%90%e8%a1%8c%e8%bf%87%e7%a8%8b%e6%95%88%e7%8e%87%e5%be%88%e4%bd%8e%e5%90%97%e8%a7%a3%e9%87%8a%e4%b8%80%e4%b8%8b%e4%b8%ba%e4%bb%80%e4%b9%88">#</a>
</h4>
<div class="book-expand">
<label>
<div class="book-expand-head flex justify-between">
<span>点击展开</span>
<span>...</span>
</div>
<input class="hidden" type="checkbox"/>
<div class="book-expand-content markdown-inner">
<p>在 ArrayList 中增加或者是删除元素，要调用System.arraycopy这种效率很低的操作，如果遇到了需要频繁插入或者是删除的时候，你可以选择其他的Java集合，比如LinkedList。</p>
<div class="highlight"><pre style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;" tabindex="0"><code class="language-java" data-lang="java"><span style="display:flex;"><span>  <span style="color:#75715e">// 源码片段 
</span></span></span><span style="display:flex;"><span><span style="color:#75715e"></span>	<span style="color:#66d9ef">public</span> <span style="color:#66d9ef">void</span> <span style="color:#a6e22e">add</span><span style="color:#f92672">(</span><span style="color:#66d9ef">int</span> index<span style="color:#f92672">,</span> E element<span style="color:#f92672">)</span> <span style="color:#f92672">{</span>
</span></span><span style="display:flex;"><span>        rangeCheckForAdd<span style="color:#f92672">(</span>index<span style="color:#f92672">);</span>   <span style="color:#75715e">// 检查索引是否合法
</span></span></span><span style="display:flex;"><span><span style="color:#75715e"></span>        modCount<span style="color:#f92672">++;</span>								<span style="color:#75715e">// 记录修改次数
</span></span></span><span style="display:flex;"><span><span style="color:#75715e"></span>        <span style="color:#66d9ef">final</span> <span style="color:#66d9ef">int</span> s<span style="color:#f92672">;</span>
</span></span><span style="display:flex;"><span>        Object<span style="color:#f92672">[]</span> elementData<span style="color:#f92672">;</span>
</span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">if</span> <span style="color:#f92672">((</span>s <span style="color:#f92672">=</span> size<span style="color:#f92672">)</span> <span style="color:#f92672">==</span> <span style="color:#f92672">(</span>elementData <span style="color:#f92672">=</span> <span style="color:#66d9ef">this</span><span style="color:#f92672">.</span><span style="color:#a6e22e">elementData</span><span style="color:#f92672">).</span><span style="color:#a6e22e">length</span><span style="color:#f92672">)</span>  <span style="color:#75715e">// 检查是否需要扩容
</span></span></span><span style="display:flex;"><span><span style="color:#75715e"></span>            elementData <span style="color:#f92672">=</span> grow<span style="color:#f92672">();</span>
</span></span><span style="display:flex;"><span>				<span style="color:#75715e">// 从 index 开始，每个元素向后移动一位
</span></span></span><span style="display:flex;"><span><span style="color:#75715e"></span>        System<span style="color:#f92672">.</span><span style="color:#a6e22e">arraycopy</span><span style="color:#f92672">(</span>elementData<span style="color:#f92672">,</span> index<span style="color:#f92672">,</span>		
</span></span><span style="display:flex;"><span>                         elementData<span style="color:#f92672">,</span> index <span style="color:#f92672">+</span> <span style="color:#ae81ff">1</span><span style="color:#f92672">,</span>
</span></span><span style="display:flex;"><span>                         s <span style="color:#f92672">-</span> index<span style="color:#f92672">);</span>
</span></span><span style="display:flex;"><span>      	<span style="color:#75715e">// index 位置空出，空出位置等于 element
</span></span></span><span style="display:flex;"><span><span style="color:#75715e"></span>        elementData<span style="color:#f92672">[</span>index<span style="color:#f92672">]</span> <span style="color:#f92672">=</span> element<span style="color:#f92672">;</span>
</span></span><span style="display:flex;"><span>      	<span style="color:#75715e">// size 加 1
</span></span></span><span style="display:flex;"><span><span style="color:#75715e"></span>        size <span style="color:#f92672">=</span> s <span style="color:#f92672">+</span> <span style="color:#ae81ff">1</span><span style="color:#f92672">;</span>
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">}</span>
</span></span></code></pre></div>
</div>
</label>
</div>
<h2 id="fail-fast-和-fail-safe">
  fail-fast 和 fail-safe
  <a class="anchor" href="#fail-fast-%e5%92%8c-fail-safe">#</a>
</h2>
<h3 id="fail-fast">
  fail-fast
  <a class="anchor" href="#fail-fast">#</a>
</h3>
<p><code>ArrayList</code> 中体现出 fail-fast 的地方主要在于 <code>modCount </code>这个变量，该变量继承自 <code>AbstractList</code> 变量，官方解释如下：</p>
<blockquote>
<p>The number of times this list has been structurally modified. Structural modifications are those that change the size of the list, or otherwise perturb it in such a fashion that iterations in progress may yield incorrect results.</p>
<p>This field is used by the iterator and list iterator implementation returned by the iterator and listIterator methods. If the value of this field changes unexpectedly, the iterator (or list iterator) will throw a ConcurrentModificationException in response to the next, remove, previous, set or add operations. This provides fail-fast behavior, rather than non-deterministic behavior in the face of concurrent modification during iteration.</p>
<p>Use of this field by subclasses is optional. If a subclass wishes to provide fail-fast iterators (and list iterators), then it merely has to increment this field in its add(int, E) and remove(int) methods (and any other methods that it overrides that result in structural modifications to the list). A single call to add(int, E) or remove(int) must add no more than one to this field, or the iterators (and list iterators) will throw bogus ConcurrentModificationExceptions. If an implementation does not wish to provide fail-fast iterators, this field may be ignored.</p>
</blockquote>
<p>modCount 仅当影响结构时，值才会变化，比如修改某个位置元素的值，modCount 值不变，但要是 add 或者 remove 操作，modCount 值就会改变。另外，ArrayList 是 fail-fast 的典型代表，ArrayList 遍历的同时不能修改，负责会引起 <code>ConcurrentModificationException</code> 报错。</p>
<p>那么是否有遍历的同时修改不会报错的方法呢？</p>
<h3 id="fail-safe">
  fail-safe
  <a class="anchor" href="#fail-safe">#</a>
</h3>
<p>CopyOnWriteArrayList 是 fail-safe 的典型代表，遍历的同时可以修改，原理是读写分离，但是会牺牲其一致性。</p>
</article>
<footer class="book-footer">
<div class="flex flex-wrap justify-between">
</div>
<script>(function(){function e(e){const t=window.getSelection(),n=document.createRange();n.selectNodeContents(e),t.removeAllRanges(),t.addRange(n)}document.querySelectorAll("pre code").forEach(t=>{t.addEventListener("click",function(){if(window.getSelection().toString())return;e(t.parentElement),navigator.clipboard&&navigator.clipboard.writeText(t.parentElement.textContent)})})})()</script>
</footer>
<div class="book-comments">
</div>
<label class="hidden book-menu-overlay" for="menu-control"></label>
</div>
<aside class="book-toc">
<div class="book-toc-content">
<nav id="TableOfContents">
<ul>
<li><a href="#掌握-arraylist-的扩容相关机制">掌握 ArrayList 的扩容相关机制</a>
<ul>
<li><a href="#目标">目标</a></li>
<li><a href="#arraylist-扩容机制">ArrayList 扩容机制</a>
<ul>
<li><a href="#相关问题">相关问题</a>
<ul>
<li><a href="#问往数组中添加-100-个元素会扩容成多大">问：往数组中添加 100 个元素，会扩容成多大？</a></li>
<li><a href="#什么情况下你会使用arraylist什么时候你会选择linkedlist">什么情况下你会使用ArrayList？什么时候你会选择LinkedList？</a></li>
<li><a href="#问arraylist是如何扩容的">问：ArrayList是如何扩容的？</a></li>
<li><a href="#arraylist的遍历有哪些方法">ArrayList的遍历有哪些方法？</a></li>
<li><a href="#如何复制某个arraylist到另一个arraylist中去">如何复制某个ArrayList到另一个ArrayList中去？</a></li>
<li><a href="#在索引中arraylist的增加或者删除某个对象的运行过程效率很低吗解释一下为什么">在索引中ArrayList的增加或者删除某个对象的运行过程？效率很低吗？解释一下为什么？</a></li>
</ul>
</li>
</ul>
</li>
<li><a href="#fail-fast-和-fail-safe">fail-fast 和 fail-safe</a>
<ul>
<li><a href="#fail-fast">fail-fast</a></li>
<li><a href="#fail-safe">fail-safe</a></li>
</ul>
</li>
</ul>
</li>
</ul>
</nav>
</div>
</aside>
</main>
</body>
</html>
